/*============================================================================*/
/*             National Instruments / System Configuration API                */
/*----------------------------------------------------------------------------*/
/*    Copyright (c) National Instruments 2013.  All Rights Reserved.          */
/*----------------------------------------------------------------------------*/
/*                                                                            */
/* Title:   nisyscfg.h                                                        */
/* Purpose: Include file to interact with the NI System Configuration API     */
/*                                                                            */
/*============================================================================*/

#ifndef ___nisysconfig_h___
#define ___nisysconfig_h___

#include <stddef.h>
#include <stdarg.h>
#include "nisyscfg_errors.h"

#if defined(_CVI_)
   #pragma EnableLibraryRuntimeChecking
#endif

// All our public functions return a signed 32-bit status code
#if defined(__WIN32__) || defined(__NT__) || defined(_WIN32) || defined(WIN32)
   #define NISYSCFGCFUNC   NISysCfgStatus __stdcall
   #define NISYSCFGCDECL   NISysCfgStatus __cdecl
   typedef unsigned __int64 NISysCfgUInt64;
#else
   #define NISYSCFGCFUNC   NISysCfgStatus
   #define NISYSCFGCDECL   NISysCfgStatus
   typedef unsigned long long NISysCfgUInt64;
#endif

#if defined(__cplusplus) || defined(__cplusplus__)
extern "C" {
#endif

// Functions that output a simple string require a user-supplied buffer of this size.
#define NISYSCFG_SIMPLE_STRING_LENGTH           1024

// Functions that auto-restart a target use a default timeout of 180 seconds (3 minutes).
// Call NISysCfgSetSystemProperty with NISysCfgSystemPropertyAutoRestartTimeout to change it.
#define NISYSCFG_REBOOT_DEFAULT_TIMEOUT_MSEC    180000

// Functions that operate on a remote target use a default timeout of 300 seconds (5 minutes).
// Call NISysCfgSetRemoteTimeout to change it.
#define NISYSCFG_REMOTE_DEFAULT_TIMEOUT_MSEC    300000

#if defined(_CVI_)
   #ifndef CVITime_DECLARED
      #define CVITime_DECLARED
      typedef struct CVITime { unsigned __int64 lsb; __int64 msb; } CVITime;
   #endif
   #ifndef CVIAbsoluteTime_DECLARED
      #define CVIAbsoluteTime_DECLARED
      typedef union CVIAbsoluteTime { CVITime cviTime; unsigned int u32Data[4]; } CVIAbsoluteTime;
   #endif
   typedef CVIAbsoluteTime NISysCfgTimestampUTC;
#else
   typedef struct { unsigned int u32Data[4]; } NISysCfgTimestampUTC;
#endif

////////////////////////////////////////////////////////////////////////////////
// Handles
////////////////////////////////////////////////////////////////////////////////

typedef void * NISysCfgSessionHandle;
typedef void * NISysCfgResourceHandle;
typedef void * NISysCfgFilterHandle;
typedef void * NISysCfgSoftwareSetHandle;
typedef void * NISysCfgEnumResourceHandle;
typedef void * NISysCfgEnumExpertHandle;
typedef void * NISysCfgEnumSystemHandle;
typedef void * NISysCfgEnumSoftwareSetHandle;
typedef void * NISysCfgEnumDependencyHandle;
typedef void * NISysCfgEnumSoftwareComponentHandle;

////////////////////////////////////////////////////////////////////////////////
// Enumerations
////////////////////////////////////////////////////////////////////////////////

typedef enum
{
   NISysCfgIncludeCachedResultsNone          = 0L,
   NISysCfgIncludeCachedResultsOnlyIfOnline  = 1L,
   NISysCfgIncludeCachedResultsAll           = 3L
} NISysCfgIncludeCachedResults;

// The initialization string may contain any combination of 1 or 2
// of the hostname, IP address, and/or MAC address.
typedef enum
{
   NISysCfgSystemNameFormatHostname          = 0x10L,       // "hostname"
   NISysCfgSystemNameFormatHostnameIp        = 0x12L,       // "hostname (1.2.3.4)"
   NISysCfgSystemNameFormatHostnameMac       = 0x13L,       // "hostname (01:02:03:04:05:06)"
   NISysCfgSystemNameFormatIp                = 0x20L,       // "1.2.3.4"
   NISysCfgSystemNameFormatIpHostname        = 0x21L,       // "1.2.3.4 (hostname)"
   NISysCfgSystemNameFormatIpMac             = 0x23L,       // "1.2.3.4 (01:02:03:04:05:06)"
   NISysCfgSystemNameFormatMac               = 0x30L,       // "01:02:03:04:05:06"
   NISysCfgSystemNameFormatMacHostname       = 0x31L,       // "01:02:03:04:05:06 (hostname)"
   NISysCfgSystemNameFormatMacIp             = 0x32L        // "01:02:03:04:05:06 (1.2.3.4)"
} NISysCfgSystemNameFormat;

typedef enum
{
   NISysCfgFileSystemDefault                 = 0x0000L,
   NISysCfgFileSystemFat                     = 0x0001L,
   NISysCfgFileSystemReliance                = 0x0002L,
   NISysCfgFileSystemUBIFS                   = 0x4000L
} NISysCfgFileSystemMode;

typedef enum
{
   NISysCfgResetPrimaryResetOthers           = 0L,
   NISysCfgPreservePrimaryResetOthers        = 1L,
   NISysCfgPreservePrimaryPreserveOthers     = 2L,
   NISysCfgPreservePrimaryApplyOthers        = 3L,
   NISysCfgApplyPrimaryResetOthers           = 4L,
   NISysCfgApplyPrimaryPreserveOthers        = 5L,
   NISysCfgApplyPrimaryApplyOthers           = 6L
} NISysCfgNetworkInterfaceSettings;

typedef enum
{
   NISysCfgItemTypeStandard                  = 0L,          // Standard
   NISysCfgItemTypeHidden                    = 1L,          // Hidden
   NISysCfgItemTypeSystem                    = 2L,          // System
   NISysCfgItemTypeUnknown                   = 3L,          // Unknown
   NISysCfgItemTypeStartup                   = 4L,          // Startup
   NISysCfgItemTypeImage                     = 5L           // Image
} NISysCfgComponentType;

typedef enum
{
   NISysCfgIncludeItemsAllVisible           = 0x0000L,      // All visible
   NISysCfgIncludeItemsAllVisibleAndHidden  = 0x0001L,      // Visible and hidden
   NISysCfgIncludeItemsOnlyStandard         = 0x0002L,      // Only standard
   NISysCfgIncludeItemsOnlyStartup          = 0x0003L       // Only startup
} NISysCfgIncludeComponentTypes;

typedef enum
{
   NISysCfgVersionSelectionHighest           = 0L,
   NISysCfgVersionSelectionExact             = 1L
} NISysCfgVersionSelectionMode;

typedef enum
{
   NISysCfgImportMergeItems                  = 0L,          // Source data "wins" in the case of overwrite conflicts
   NISysCfgImportDeleteConfigFirst           = 0x100000L,   // Delete product data at destination prior to copying
   NISysCfgImportPreserveConflictItems       = 0x200000L    // Destination data "wins" in the case of overwrite conflicts
} NISysCfgImportMode;

typedef enum
{
   NISysCfgReportXml                         = 0L,
   NISysCfgReportHtml                        = 1L,
   NISysCfgReportTechnicalSupportZip         = 2L
} NISysCfgReportType;

typedef enum
{
   NISysCfgBusTypeBuiltIn                    = 0L,
   NISysCfgBusTypePciPxi                     = 1L,
   NISysCfgBusTypeUsb                        = 2L,
   NISysCfgBusTypeGpib                       = 3L,
   NISysCfgBusTypeVxi                        = 4L,
   NISysCfgBusTypeSerial                     = 5L,
   NISysCfgBusTypeTcpIp                      = 6L,
   NISysCfgBusTypeCompactRio                 = 7L,
   NISysCfgBusTypeScxi                       = 8L,
   NISysCfgBusTypeCompactDaq                 = 9L,
   NISysCfgBusTypeSwitchBlock                = 10L
} NISysCfgBusType;

typedef enum
{
   NISysCfgHasDriverTypeUnknown              = -1L,
   NISysCfgHasDriverTypeNotInstalled         = 0L,
   NISysCfgHasDriverTypeInstalled            = 1L
} NISysCfgHasDriverType;

typedef enum
{
   NISysCfgIsPresentTypeUnknown              = -1L,
   NISysCfgIsPresentTypeNotPresent           = 0L,
   NISysCfgIsPresentTypePresent              = 1L
} NISysCfgIsPresentType;

typedef enum
{
   NISysCfgIpAddressModeStatic               = 1L,
   NISysCfgIpAddressModeDhcpOrLinkLocal      = 2L,
   NISysCfgIpAddressModeLinkLocalOnly        = 4L,
   NISysCfgIpAddressModeDhcpOnly             = 8L
} NISysCfgIpAddressMode;

typedef enum
{
   NISysCfgBoolFalse                         = 0L,
   NISysCfgBoolTrue                          = 1L
} NISysCfgBool;

typedef enum
{
   NISysCfgLocaleDefault                     = 0L,
   NISysCfgLocaleChineseSimplified           = 2052L,
   NISysCfgLocaleEnglish                     = 1033L,
   NISysCfgLocaleFrench                      = 1036L,
   NISysCfgLocaleGerman                      = 1031L,
   NISysCfgLocaleJapanese                    = 1041L,
   NISysCfgLocaleKorean                      = 1042L
} NISysCfgLocale;

typedef enum
{
   NISysCfgFilterModeMatchValuesAll          = 1L,
   NISysCfgFilterModeMatchValuesAny          = 2L,
   NISysCfgFilterModeMatchValuesNone         = 3L,
   NISysCfgFilterModeAllPropertiesExist      = 4L
} NISysCfgFilterMode;

typedef enum
{
   NISysCfgServiceTypemDnsNiTcp              = 0L,
   NISysCfgServiceTypemDnsNiRealtime         = 1L,
   NISysCfgServiceTypemDnsNiSysapi           = 2L,
   NISysCfgServiceTypemDnsNiHttp             = 3L,
   NISysCfgServiceTypeLocalSystem            = 4L,
   NISysCfgServiceTypeLocalNetInterface      = 5L,
   NISysCfgServiceTypeLocalTimeKeeper        = 6L,
   NISysCfgServiceTypeLocalTimeSource        = 7L,
   NISysCfgServiceTypemDnsLxi                = 8L
} NISysCfgServiceType;

typedef enum
{
   NISysCfgAdapterTypeEthernet               = 1L,
   NISysCfgAdapterTypeWlan                   = 2L
} NISysCfgAdapterType;

typedef enum
{
   NISysCfgAdapterModeDisabled               = 1L,
   NISysCfgAdapterModeTcpIpEthernet          = 2L,
   NISysCfgAdapterModeDeterministic          = 4L,
   NISysCfgAdapterModeEtherCat               = 8L,
   NISysCfgAdapterModeTcpIpWlan              = 32L,
   NISysCfgAdapterModeTcpIpAccessPoint       = 64L
} NISysCfgAdapterMode;

typedef enum
{
   NISysCfgLinkSpeedNone                     = 0L,
   NISysCfgLinkSpeedAuto                     = 1L,
   NISysCfgLinkSpeed10mbHalf                 = 2L,
   NISysCfgLinkSpeed10mbFull                 = 4L,
   NISysCfgLinkSpeed100mbHalf                = 8L,
   NISysCfgLinkSpeed100mbFull                = 16L,
   NISysCfgLinkSpeedGigabitHalf              = 32L,
   NISysCfgLinkSpeedGigabitFull              = 64L,
   // Wireless 802.11 protocols (speeds)
   NISysCfgLinkSpeedWlan80211a               = 131072L,
   NISysCfgLinkSpeedWlan80211b               = 262144L,
   NISysCfgLinkSpeedWlan80211g               = 524288L,
   NISysCfgLinkSpeedWlan80211n               = 1048576L,
   NISysCfgLinkSpeedWlan80211n5GHz           = 2097152L
} NISysCfgLinkSpeed;

typedef enum
{
   NISysCfgPacketDetectionNone               = 0L,
   NISysCfgPacketDetectionLineInterrupt      = 1L,
   NISysCfgPacketDetectionPolling            = 2L,
   NISysCfgPacketDetectionSignaledInterrupt  = 4L
} NISysCfgPacketDetection;

typedef enum
{
   NISysCfgConnectionTypeNone                = 0L,
   NISysCfgConnectionTypeInfrastructure      = 1L,
   NISysCfgConnectionTypeAdHoc               = 2L
} NISysCfgConnectionType;

typedef enum
{
   NISysCfgSecurityTypeNone                  = 0L,
   NISysCfgSecurityTypeNotSupported          = 1L,
   NISysCfgSecurityTypeOpen                  = 2L,
   NISysCfgSecurityTypeWep                   = 4L,
   NISysCfgSecurityTypeWpaPsk                = 8L,
   NISysCfgSecurityTypeWpaEap                = 16L, 
   NISysCfgSecurityTypeWpa2Psk               = 32L,
   NISysCfgSecurityTypeWpa2Eap               = 64L
} NISysCfgSecurityType;

typedef enum
{
   NISysCfgEapTypeNone                       = 0L,
   NISysCfgEapTypeEapTls                     = 1L,
   NISysCfgEapTypeEapTtls                    = 2L,
   NISysCfgEapTypeEapFast                    = 4L,
   NISysCfgEapTypeLeap                       = 8L,
   NISysCfgEapTypePeap                       = 16L
} NISysCfgEapType;

// Negative firmware states are in-progress; the user should continue polling.
// Non-negative firmware states are terminal; no update operation is in progress.
typedef enum
{
   NISysCfgFirmwareReadyPendingAutoRestart   = -4L,
   NISysCfgFirmwareVerifyingNewImage         = -3L,
   NISysCfgFirmwareWritingFlashingNewImage   = -2L,
   NISysCfgFirmwareUpdateModeWaitingForImage = -1L,
   NISysCfgFirmwareCorruptCannotRun          =  0L,
   NISysCfgFirmwareNoneInstalled             =  1L,
   NISysCfgFirmwareInstalledNormalOperation  =  2L,
   NISysCfgFirmwareReadyPendingUserRestart   =  3L,
   NISysCfgFirmwareReadyPendingUserAction    =  4L,
   NISysCfgFirmwareUpdateAttemptFailed       =  5L
} NISysCfgFirmwareStatus;

typedef enum
{
   NISysCfgAccessTypeLocalOnly               = 0L,
   NISysCfgAccessTypeLocalAndRemote          = 1L
} NISysCfgAccessType;

// NOTE: For string properties, callers pass in a pointer to a buffer or array they have allocated.
typedef enum
{
   // Read-only properties
   NISysCfgResourcePropertyIsDevice                            = 16781312L,   // NISysCfgBool
   NISysCfgResourcePropertyIsChassis                           = 16941056L,   // NISysCfgBool
   NISysCfgResourcePropertyConnectsToBusType                   = 16785408L,   // NISysCfgBusType
   NISysCfgResourcePropertyVendorId                            = 16789504L,   // unsigned int
   NISysCfgResourcePropertyVendorName                          = 16793600L,   // char *
   NISysCfgResourcePropertyProductId                           = 16797696L,   // unsigned int
   NISysCfgResourcePropertyProductName                         = 16801792L,   // char *
   NISysCfgResourcePropertySerialNumber                        = 16805888L,   // char *
   NISysCfgResourcePropertyFirmwareRevision                    = 16969728L,   // char *
   NISysCfgResourcePropertyIsNIProduct                         = 16809984L,   // NISysCfgBool
   NISysCfgResourcePropertyIsSimulated                         = 16814080L,   // NISysCfgBool
   NISysCfgResourcePropertyConnectsToLinkName                  = 16818176L,   // char *
   NISysCfgResourcePropertyHasDriver                           = 16920576L,   // NISysCfgHasDriverType
   NISysCfgResourcePropertyIsPresent                           = 16924672L,   // NISysCfgIsPresentType
   NISysCfgResourcePropertySlotNumber                          = 16822272L,   // int
   NISysCfgResourcePropertySupportsInternalCalibration         = 16842752L,   // NISysCfgBool
   NISysCfgResourcePropertyInternalCalibrationLastTime         = 16846848L,   // NISysCfgTimestampUTC
   NISysCfgResourcePropertyInternalCalibrationLastTemp         = 16850944L,   // double
   NISysCfgResourcePropertySupportsExternalCalibration         = 16859136L,   // NISysCfgBool
   NISysCfgResourcePropertyExternalCalibrationLastTime         = 16863232L,   // NISysCfgTimestampUTC
   NISysCfgResourcePropertyExternalCalibrationLastTemp         = 16867328L,   // double
   NISysCfgResourcePropertyRecommendedNextCalibrationTime      = 16871424L,   // NISysCfgTimestampUTC
   NISysCfgResourcePropertyCalibrationComments                 = 16961536L,   // char *
   NISysCfgResourcePropertyCurrentTemp                         = 16965632L,   // double
   NISysCfgResourcePropertyPxiPciBusNumber                     = 16875520L,   // unsigned int
   NISysCfgResourcePropertyPxiPciDeviceNumber                  = 16879616L,   // unsigned int
   NISysCfgResourcePropertyPxiPciFunctionNumber                = 16883712L,   // unsigned int
   NISysCfgResourcePropertyPxiPciLinkWidth                     = 16973824L,   // int
   NISysCfgResourcePropertyPxiPciMaxLinkWidth                  = 16977920L,   // int
   NISysCfgResourcePropertyPxiPciSlotLinkWidth                 = 16982016L,   // int
   NISysCfgResourcePropertyUsbInterface                        = 16887808L,   // unsigned int
   NISysCfgResourcePropertyTcpHostName                         = 16928768L,   // char *
   NISysCfgResourcePropertyTcpMacAddress                       = 16986112L,   // char *
   NISysCfgResourcePropertyTcpIpAddress                        = 16957440L,   // char *
   NISysCfgResourcePropertyTcpDeviceClass                      = 17022976L,   // char *
   NISysCfgResourcePropertyGpibPrimaryAddress                  = 16994304L,   // int
   NISysCfgResourcePropertyGpibSecondaryAddress                = 16998400L,   // int
   NISysCfgResourcePropertyProvidesBusType                     = 16932864L,   // NISysCfgBusType
   NISysCfgResourcePropertyProvidesLinkName                    = 16936960L,   // char *
   NISysCfgResourcePropertyNumberOfSlots                       = 16826368L,   // int
   NISysCfgResourcePropertySupportsFirmwareUpdate              = 17080320L,   // NISysCfgBool
   NISysCfgResourcePropertyFirmwareFilePattern                 = 17084416L,   // char *

   // Read/Write remote access properties
   NISysCfgResourcePropertySysCfgAccess                        = 219504640L,  // NISysCfgAccessType

   // Read-only network adapter properties
   NISysCfgResourcePropertyAdapterType                         = 219332608L,  // NISysCfgAdapterType
   NISysCfgResourcePropertyMacAddress                          = 219168768L,  // char *

   // Read/Write network adapter properties
   NISysCfgResourcePropertyAdapterMode                         = 219160576L,  // NISysCfgAdapterMode
   NISysCfgResourcePropertyTcpIpRequestMode                    = 219172864L,  // NISysCfgIpAddressMode
   NISysCfgResourcePropertyTcpIpv4Address                      = 219181056L,  // char *
   NISysCfgResourcePropertyTcpIpv4Subnet                       = 219189248L,  // char *
   NISysCfgResourcePropertyTcpIpv4Gateway                      = 219193344L,  // char *
   NISysCfgResourcePropertyTcpIpv4DnsServer                    = 219197440L,  // char *
   NISysCfgResourcePropertyTcpPreferredLinkSpeed               = 219213824L,  // NISysCfgLinkSpeed
   NISysCfgResourcePropertyTcpCurrentLinkSpeed                 = 219217920L,  // NISysCfgLinkSpeed
   NISysCfgResourcePropertyTcpPacketDetection                  = 219258880L,  // NISysCfgPacketDetection
   NISysCfgResourcePropertyTcpPollingInterval                  = 219262976L,  // unsigned int
   NISysCfgResourcePropertyIsPrimaryAdapter                    = 219308032L,  // NISysCfgBool
   NISysCfgResourcePropertyEtherCatMasterId                    = 219250688L,  // unsigned int
   NISysCfgResourcePropertyEtherCatMasterRedundancy            = 219500544L,  // NISysCfgBool

   // Read-only wireless network adapter properties
   NISysCfgResourcePropertyWlanBssid                           = 219398144L,  // char *
   NISysCfgResourcePropertyWlanCurrentLinkQuality              = 219394048L,  // unsigned int

   // Read/Write wireless network adapter properties
   NISysCfgResourcePropertyWlanCurrentSsid                     = 219377664L,  // char *
   NISysCfgResourcePropertyWlanCurrentConnectionType           = 219381760L,  // NISysCfgConnectionType
   NISysCfgResourcePropertyWlanCurrentSecurityType             = 219385856L,  // NISysCfgSecurityType
   NISysCfgResourcePropertyWlanCurrentEapType                  = 219389952L,  // NISysCfgEapType
   NISysCfgResourcePropertyWlanCountryCode                     = 219406336L,  // int
   NISysCfgResourcePropertyWlanChannelNumber                   = 219410432L,  // unsigned int
   NISysCfgResourcePropertyWlanClientCertificate               = 219422720L,  // char *

   // Write-only wireless network adapter properties
   NISysCfgResourcePropertyWlanSecurityIdentity                = 219414528L,  // char *
   NISysCfgResourcePropertyWlanSecurityKey                     = 219418624L,  // char *

   // Read-only time properties
   NISysCfgResourcePropertySystemStartTime                     = 17108992L,    // NISysCfgTimestampUTC 

   // Read/Write time properties
   NISysCfgResourcePropertyCurrentTime                         = 219279360L,   // NISysCfgTimestampUTC 
   NISysCfgResourcePropertyTimeZone                            = 219471872L,   // char *

   // Read/Write startup settings properties
   NISysCfgResourcePropertyUserDirectedSafeModeSwitch          = 219537408L,   // NISysCfgBool
   NISysCfgResourcePropertyConsoleOutSwitch                    = 219541504L,   // NISysCfgBool
   NISysCfgResourcePropertyIpResetSwitch                       = 219545600L,   // NISysCfgBool

   // Read-only counts for indexed properties
   NISysCfgResourcePropertyNumberOfDiscoveredAccessPoints      = 219365376L,  // unsigned int
   NISysCfgResourcePropertyNumberOfExperts                     = 16891904L,   // int
   NISysCfgResourcePropertyNumberOfServices                    = 17010688L,   // int
   NISysCfgResourcePropertyNumberOfAvailableFirmwareVersions   = 17088512L,   // int
   NISysCfgResourcePropertyNumberOfCpus                        = 17137664L,   // int
   NISysCfgResourcePropertyNumberOfFans                        = 17174528L,   // int
   NISysCfgResourcePropertyNumberOfTemperatureSensors          = 17186816L,   // int
   NISysCfgResourcePropertyNumberOfVoltageSensors              = 17149952L    // int
} NISysCfgResourceProperty;

typedef enum
{
   // Read-only properties
   NISysCfgIndexedPropertyServiceType                          = 17014784L,   // NISysCfgServiceType
   NISysCfgIndexedPropertyAvailableFirmwareVersion             = 17092608L,   // char *

   // Read-only wireless network adapter properties
   NISysCfgIndexedPropertyWlanAvailableSsid                    = 219336704L,  // char *
   NISysCfgIndexedPropertyWlanAvailableBssid                   = 219443200L,  // char *
   NISysCfgIndexedPropertyWlanAvailableConnectionType          = 219340800L,  // NISysCfgConnectionType
   NISysCfgIndexedPropertyWlanAvailableSecurityType            = 219344896L,  // NISysCfgSecurityType
   NISysCfgIndexedPropertyWlanAvailableLinkQuality             = 219353088L,  // unsigned int
   NISysCfgIndexedPropertyWlanAvailableChannelNumber           = 219357184L,  // unsigned int
   NISysCfgIndexedPropertyWlanAvailableLinkSpeed               = 219361280L,  // NISysCfgLinkSpeed

   // Read-only properties
   NISysCfgIndexedPropertyCpuTotalLoad                         = 17141760L,   // unsigned int
   NISysCfgIndexedPropertyCpuInterruptLoad                     = 17145856L,   // unsigned int
   NISysCfgIndexedPropertyFanName                              = 17178624L,   // char *
   NISysCfgIndexedPropertyFanReading                           = 17182720L,   // unsigned int
   NISysCfgIndexedPropertyTemperatureName                      = 17190912L,   // char *
   NISysCfgIndexedPropertyTemperatureReading                   = 16965632L,   // double
   NISysCfgIndexedPropertyTemperatureLowerCritical             = 17195008L,   // double
   NISysCfgIndexedPropertyTemperatureUpperCritical             = 17199104L,   // double
   NISysCfgIndexedPropertyVoltageName                          = 17154048L,   // char *
   NISysCfgIndexedPropertyVoltageReading                       = 17158144L,   // double
   NISysCfgIndexedPropertyVoltageNominal                       = 17162240L,   // double
   NISysCfgIndexedPropertyVoltageLowerCritical                 = 17166336L,   // double
   NISysCfgIndexedPropertyVoltageUpperCritical                 = 17170432L,   // double

   // Read-only properties
   NISysCfgIndexedPropertyExpertName                           = 16900096L,   // char *
   NISysCfgIndexedPropertyExpertResourceName                   = 16896000L,   // char *
   NISysCfgIndexedPropertyExpertUserAlias                      = 16904192L    // char *
} NISysCfgIndexedProperty;

typedef enum
{
   // Read-only properties
   NISysCfgSystemPropertyDeviceClass                           = 16941057L,   // char *
   NISysCfgSystemPropertyProductId                             = 16941058L,   // int
   NISysCfgSystemPropertyFileSystem                            = 16941060L,   // NISysCfgFileSystemMode
   NISysCfgSystemPropertyFirmwareRevision                      = 16941061L,   // char *
   NISysCfgSystemPropertyIsFactoryResetSupported               = 16941067L,   // NISysCfgBool
   NISysCfgSystemPropertyIsFirmwareUpdateSupported             = 16941068L,   // NISysCfgBool
   NISysCfgSystemPropertyIsLocked                              = 16941069L,   // NISysCfgBool
   NISysCfgSystemPropertyIsLockingSupported                    = 16941070L,   // NISysCfgBool
   NISysCfgSystemPropertyIsOnLocalSubnet                       = 16941072L,   // NISysCfgBool
   NISysCfgSystemPropertyIsRestartSupported                    = 16941076L,   // NISysCfgBool
   NISysCfgSystemPropertyMacAddress                            = 16941077L,   // char *
   NISysCfgSystemPropertyProductName                           = 16941078L,   // char *
   NISysCfgSystemPropertyOperatingSystem                       = 16941079L,   // char *
   NISysCfgSystemPropertyOperatingSystemVersion                = 17100800L,   // char *
   NISysCfgSystemPropertyOperatingSystemDescription            = 17104896L,   // char *
   NISysCfgSystemPropertySerialNumber                          = 16941080L,   // char *
   NISysCfgSystemPropertySystemState                           = 16941082L,   // char *
   NISysCfgSystemPropertyMemoryPhysTotal                       = 219480064L,  // double
   NISysCfgSystemPropertyMemoryPhysFree                        = 219484160L,  // double
   NISysCfgSystemPropertyMemoryLargestBlock                    = 219488256L,  // double
   NISysCfgSystemPropertyMemoryVirtTotal                       = 219492352L,  // double
   NISysCfgSystemPropertyMemoryVirtFree                        = 219496448L,  // double
   NISysCfgSystemPropertyPrimaryDiskTotal                      = 219291648L,  // double
   NISysCfgSystemPropertyPrimaryDiskFree                       = 219295744L,  // double
   NISysCfgSystemPropertyLocalSystemResourceHandle             = 16941086L,   // NISysCfgResourceHandle
   NISysCfgSystemPropertyImageDescription                      = 219516928L,  // char *
   NISysCfgSystemPropertyImageId                               = 219521024L,  // char *
   NISysCfgSystemPropertyImageTitle                            = 219525120L,  // char *
   NISysCfgSystemPropertyImageVersion                          = 219529216L,  // char *

   // Read/Write properties
   NISysCfgSystemPropertyIsDst                                 = 16941066L,   // NISysCfgBool
   NISysCfgSystemPropertyIsRestartProtected                    = 16941073L,   // NISysCfgBool
   NISysCfgSystemPropertyHaltOnError                           = 16941074L,   // NISysCfgBool
   NISysCfgSystemPropertyRepositoryLocation                    = 16941084L,   // char *
   NISysCfgSystemPropertySystemComment                         = 16941081L,   // char *
   NISysCfgSystemPropertyAutoRestartTimeout                    = 16941085L,   // unsigned int

   // Read/Write network adapter properties
   NISysCfgSystemPropertyDnsServer                             = 16941059L,   // char *
   NISysCfgSystemPropertyGateway                               = 16941062L,   // char *
   NISysCfgSystemPropertyHostname                              = 16941063L,   // char *
   NISysCfgSystemPropertyIpAddress                             = 16941064L,   // char *
   NISysCfgSystemPropertyIpAddressMode                         = 16941065L,   // NISysCfgIpAddressMode
   NISysCfgSystemPropertySubnetMask                            = 16941083L    // char *
} NISysCfgSystemProperty;

typedef enum
{
   // Write-only properties
   NISysCfgFilterPropertyIsDevice                              = 16781312L,   // NISysCfgBool
   NISysCfgFilterPropertyIsChassis                             = 16941056L,   // NISysCfgBool
   NISysCfgFilterPropertyServiceType                           = 17014784L,   // NISysCfgServiceType
   NISysCfgFilterPropertyConnectsToBusType                     = 16785408L,   // NISysCfgBusType
   NISysCfgFilterPropertyConnectsToLinkName                    = 16818176L,   // char *
   NISysCfgFilterPropertyProvidesBusType                       = 16932864L,   // NISysCfgBusType
   NISysCfgFilterPropertyVendorId                              = 16789504L,   // unsigned int
   NISysCfgFilterPropertyProductId                             = 16797696L,   // unsigned int
   NISysCfgFilterPropertyIsNIProduct                           = 16809984L,   // NISysCfgBool
   NISysCfgFilterPropertyIsSimulated                           = 16814080L,   // NISysCfgBool
   NISysCfgFilterPropertySlotNumber                            = 16822272L,   // int
   NISysCfgFilterPropertyHasDriver                             = 16920576L,   // NISysCfgHasDriverType
   NISysCfgFilterPropertyIsPresent                             = 16924672L,   // NISysCfgIsPresentType
   NISysCfgFilterPropertySupportsCalibration                   = 16908288L,   // NISysCfgBool
   NISysCfgFilterPropertySupportsFirmwareUpdate                = 17080320L,   // NISysCfgBool
   NISysCfgFilterPropertyProvidesLinkName                      = 16936960L,   // char *
   NISysCfgFilterPropertyResourceName                          = 16896000L,   // char *
   NISysCfgFilterPropertyUserAlias                             = 16904192L    // char *
} NISysCfgFilterProperty;

// These macros are provided for backward compatibility
#define NISysCfgFilterModeAll                         NISysCfgFilterModeMatchValuesAll
#define NISysCfgFilterModeAny                         NISysCfgFilterModeMatchValuesAny
#define NISysCfgFilterModeNone                        NISysCfgFilterModeMatchValuesNone
#define NISysCfgPacketDetectionInterrupt              NISysCfgPacketDetectionLineInterrupt
#define NISysCfgResourcePropertyWlanAvailableCount    NISysCfgResourcePropertyNumberOfDiscoveredAccessPoints
#define NISysCfgResetPrimaryDisableOthers             NISysCfgResetPrimaryResetOthers
#define NISysCfgPreservePrimaryDisableOthers          NISysCfgPreservePrimaryResetOthers
#define NISysCfgApplyPrimaryDisableOthers             NISysCfgApplyPrimaryResetOthers

////////////////////////////////////////////////////////////////////////////////
// System Configuration core functions
////////////////////////////////////////////////////////////////////////////////

// Initialize/Close.
NISYSCFGCFUNC NISysCfgInitializeSession(
   const char *                           targetName,                // NULL or "" => localhost
   const char *                           username,                  // NULL or "" => no credentials
   const char *                           password,                  // NULL or "" => no credentials
   NISysCfgLocale                         language,                  // LCID or 0 to indicate default.
   NISysCfgBool                           forcePropertyRefresh,
   unsigned int                           connectTimeoutMsec,
   NISysCfgEnumExpertHandle *             expertEnumHandle,          // Can be NULL
   NISysCfgSessionHandle *                sessionHandle
   );

// This function is used to close a session or any other handle type returned by this API.
NISYSCFGCFUNC NISysCfgCloseHandle(
   void *                                 syscfgHandle
   );

NISYSCFGCFUNC NISysCfgGetSystemExperts(
   NISysCfgSessionHandle                  sessionHandle,
   const char *                           expertNames,               // NULL or "" => all experts
   NISysCfgEnumExpertHandle *             expertEnumHandle
   );

NISYSCFGCFUNC NISysCfgSetRemoteTimeout(
   NISysCfgSessionHandle                  sessionHandle,
   unsigned int                           remoteTimeoutMsec
   );

NISYSCFGCFUNC NISysCfgFindHardware(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgFilterMode                     filterMode,                // Ignored if filter handle is NULL
   NISysCfgFilterHandle                   filterHandle,              // Can be NULL
   const char *                           expertNames,               // NULL or "" => all experts
   NISysCfgEnumResourceHandle *           resourceEnumHandle
   );

NISYSCFGCFUNC NISysCfgFindSystems(
   NISysCfgSessionHandle                  sessionHandle,             // Can be NULL or a session to "localhost"
   const char *                           deviceClass,               // NULL or "" => all classes
   NISysCfgBool                           detectOnlineSystems,
   NISysCfgIncludeCachedResults           cacheMode,
   NISysCfgSystemNameFormat               findOutputMode,
   unsigned int                           timeoutMsec,
   NISysCfgBool                           onlyInstallableSystems,
   NISysCfgEnumSystemHandle *             systemEnumHandle
   );

// Caller should free detailedResult using NISysCfgFreeDetailedString
NISYSCFGCFUNC NISysCfgSelfTestHardware(
   NISysCfgResourceHandle                 resourceHandle,
   unsigned int                           mode,
   char **                                detailedResult
   );

// Caller should free detailedResult using NISysCfgFreeDetailedString
NISYSCFGCFUNC NISysCfgSelfCalibrateHardware(
   NISysCfgResourceHandle                 resourceHandle,
   char **                                detailedResult
   );

NISYSCFGCFUNC NISysCfgResetHardware(
   NISysCfgResourceHandle                 resourceHandle,
   unsigned int                           mode
   );

NISYSCFGCFUNC NISysCfgRenameResource(
   NISysCfgResourceHandle                 resourceHandle,
   const char *                           newName,
   NISysCfgBool                           overwriteIfExists,
   NISysCfgBool                           updateDependencies,
   NISysCfgBool *                         nameAlreadyExisted,        // Can be NULL
   NISysCfgResourceHandle *               overwrittenResourceHandle  // Can be NULL
   );

NISYSCFGCFUNC NISysCfgGetResourceProperty(
   NISysCfgResourceHandle                 resourceHandle,
   NISysCfgResourceProperty               propertyID,
   void *                                 value
   );

NISYSCFGCDECL NISysCfgSetResourceProperty(
   NISysCfgResourceHandle                 resourceHandle,
   NISysCfgResourceProperty               propertyID,
   ...
   );

NISYSCFGCFUNC NISysCfgSetResourcePropertyV(
   NISysCfgResourceHandle                 resourceHandle,
   NISysCfgResourceProperty               propertyID,
   va_list                                args
   );

NISYSCFGCFUNC NISysCfgGetResourceIndexedProperty(
   NISysCfgResourceHandle                 resourceHandle,
   NISysCfgIndexedProperty                propertyID,
   unsigned int                           index,
   void *                                 value
   );

// Caller should free detailedResult using NISysCfgFreeDetailedString
NISYSCFGCFUNC NISysCfgSaveResourceChanges(
   NISysCfgResourceHandle                 resourceHandle,
   NISysCfgBool *                         changesRequireRestart,
   char **                                detailedResult
   );

NISYSCFGCFUNC NISysCfgGetSystemProperty(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgSystemProperty                 propertyID,
   void *                                 value
   );

NISYSCFGCDECL NISysCfgSetSystemProperty(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgSystemProperty                 propertyID,
   ...
   );

NISYSCFGCFUNC NISysCfgSetSystemPropertyV(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgSystemProperty                 propertyID,
   va_list                                args
   );

// Caller should free detailedResult using NISysCfgFreeDetailedString
NISYSCFGCFUNC NISysCfgSaveSystemChanges(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgBool *                         changesRequireRestart,
   char **                                detailedResult
   );

NISYSCFGCFUNC NISysCfgCreateFilter(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgFilterHandle *                 filterHandle
   );

NISYSCFGCDECL NISysCfgSetFilterProperty(
   NISysCfgFilterHandle                   filterHandle,
   NISysCfgFilterProperty                 propertyID,
   ...
   );

NISYSCFGCFUNC NISysCfgSetFilterPropertyV(
   NISysCfgFilterHandle                   filterHandle,
   NISysCfgFilterProperty                 propertyID,
   va_list                                args
   );

////////////////////////////////////////////////////////////////////////////////
// System Configuration firmware modification functions
////////////////////////////////////////////////////////////////////////////////

// Caller should free detailedResult using NISysCfgFreeDetailedString
NISYSCFGCFUNC NISysCfgUpgradeFirmwareFromFile(
   NISysCfgResourceHandle                 resourceHandle,
   const char *                           firmwareFile,
   NISysCfgBool                           autoStopTasks,
   NISysCfgBool                           alwaysOverwrite,
   NISysCfgBool                           waitForOperationToFinish,
   NISysCfgFirmwareStatus *               firmwareStatus,
   char **                                detailedResult
   );

// Caller should free detailedResult using NISysCfgFreeDetailedString
NISYSCFGCFUNC NISysCfgUpgradeFirmwareVersion(
   NISysCfgResourceHandle                 resourceHandle,
   const char *                           firmwareVersion,
   NISysCfgBool                           autoStopTasks,
   NISysCfgBool                           alwaysOverwrite,
   NISysCfgBool                           waitForOperationToFinish,
   NISysCfgFirmwareStatus *               firmwareStatus,
   char **                                detailedResult
   );

// Caller should free detailedResult using NISysCfgFreeDetailedString
NISYSCFGCFUNC NISysCfgEraseFirmware(
   NISysCfgResourceHandle                 resourceHandle,
   NISysCfgBool                           autoStopTasks,
   NISysCfgFirmwareStatus *               firmwareStatus,
   char **                                detailedResult
   );

// Caller should free detailedResult using NISysCfgFreeDetailedString
NISYSCFGCFUNC NISysCfgCheckFirmwareStatus(
   NISysCfgResourceHandle                 resourceHandle,
   int *                                  percentComplete,
   NISysCfgFirmwareStatus *               firmwareStatus,
   char **                                detailedResult
   );

////////////////////////////////////////////////////////////////////////////////
// System Configuration software and installation functions
////////////////////////////////////////////////////////////////////////////////

NISYSCFGCFUNC NISysCfgFormat(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgBool                           forceSafeMode,
   NISysCfgBool                           restartAfterFormat,
   NISysCfgFileSystemMode                 fileSystem,
   NISysCfgNetworkInterfaceSettings       networkSettings,
   unsigned int                           timeoutMsec
   );

NISYSCFGCFUNC NISysCfgRestart(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgBool                           waitForRestartToFinish,
   NISysCfgBool                           installMode,
   NISysCfgBool                           flushDNS,
   unsigned int                           timeoutMsec,
   char                                   newIpAddress[]
   );

NISYSCFGCFUNC NISysCfgGetAvailableSoftwareComponents(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgIncludeComponentTypes          itemTypes,
   NISysCfgEnumSoftwareComponentHandle *  componentEnumHandle
   );

NISYSCFGCFUNC NISysCfgGetAvailableSoftwareSets(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgEnumSoftwareSetHandle *        setEnumHandle
   );

NISYSCFGCFUNC NISysCfgGetFilteredSoftwareComponents(
  const char *                            repositoryPath,
  const char *                            deviceClass,
  const char *                            operatingSystem,
  unsigned int                            productID,
  NISysCfgIncludeComponentTypes           itemTypes,
  NISysCfgEnumSoftwareComponentHandle *   componentEnumHandle
  );

NISYSCFGCFUNC NISysCfgGetFilteredSoftwareSets(
  const char *                            repositoryPath,
  const char *                            deviceClass,
  const char *                            operatingSystem,
  unsigned int                            productID,
  NISysCfgEnumSoftwareSetHandle *         setEnumHandle
  );

NISYSCFGCFUNC NISysCfgGetInstalledSoftwareComponents(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgIncludeComponentTypes          itemTypes,
   NISysCfgBool                           cached,
   NISysCfgEnumSoftwareComponentHandle *  componentEnumHandle
   );

NISYSCFGCFUNC NISysCfgGetInstalledSoftwareSet(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgBool                           cached,
   NISysCfgSoftwareSetHandle *            setHandle
   );

NISYSCFGCFUNC NISysCfgGetSystemImageAsFolder(
   NISysCfgSessionHandle                  sessionHandle,
   const char *                           destinationFolder,
   const char *                           encryptionPassphrase,
   NISysCfgBool                           overwriteIfExists,
   NISysCfgBool                           installedSoftwareOnly,
   NISysCfgBool                           autoRestart
   );

NISYSCFGCFUNC NISysCfgGetSystemImageAsFolder2(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgBool                           autoRestart,
   const char *                           destinationFolder,
   const char *                           encryptionPassphrase,
   unsigned int                           numBlacklistEntries,
   const char **                          blacklistFilesDirectories, // Can be NULL if numBlacklistEntries==0
   NISysCfgBool                           overwriteIfExists,
   NISysCfgBool                           installedSoftwareOnly
   );

NISYSCFGCFUNC NISysCfgSetSystemImageFromFolder(
   NISysCfgSessionHandle                  sessionHandle,
   const char *                           sourceFolder,
   const char *                           encryptionPassphrase,
   NISysCfgBool                           autoRestart,
   NISysCfgBool                           originalSystemOnly
   );

NISYSCFGCFUNC NISysCfgSetSystemImageFromFolder2(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgBool                           autoRestart,
   const char *                           sourceFolder,
   const char *                           encryptionPassphrase,
   unsigned int                           numBlacklistEntries,
   const char **                          blacklistFilesDirectories, // Can be NULL if numBlacklistEntries==0
   NISysCfgBool                           originalSystemOnly,
   NISysCfgNetworkInterfaceSettings       networkSettings
   );

NISYSCFGCFUNC NISysCfgInstallAll(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgBool                           autoRestart,
   NISysCfgBool                           deselectConflicts,
   NISysCfgEnumSoftwareComponentHandle *  installedComponentEnumHandle,
   NISysCfgEnumDependencyHandle *         brokenDependencyEnumHandle
   );

NISYSCFGCFUNC NISysCfgInstallUninstallComponents(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgBool                           autoRestart,
   NISysCfgBool                           autoSelectDependencies,
   NISysCfgEnumSoftwareComponentHandle    componentToInstallEnumHandle,
   unsigned int                           numComponentsToUninstall,
   const char **                          componentIDsToUninstall,   // Can be NULL if numComponentsToUninstall==0
   NISysCfgEnumDependencyHandle*          brokenDependencyEnumHandle
   );

NISYSCFGCFUNC NISysCfgInstallSoftwareSet(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgBool                           autoRestart,
   const char *                           softwareSetID,
   const char *                           version,
   NISysCfgEnumSoftwareComponentHandle    addonEnumHandle,
   NISysCfgEnumDependencyHandle *         brokenDependencyEnumHandle
   );

NISYSCFGCFUNC NISysCfgInstallStartup(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgBool                           autoRestart,
   NISysCfgEnumSoftwareComponentHandle    startupEnumHandle,
   NISysCfgBool                           uninstallConflicts,
   NISysCfgEnumSoftwareComponentHandle *  installedComponentEnumHandle,
   NISysCfgEnumSoftwareComponentHandle *  uninstalledComponentEnumHandle,
   NISysCfgEnumDependencyHandle *         brokenDependencyEnumHandle
   );

NISYSCFGCFUNC NISysCfgUninstallAll(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgBool                           autoRestart
   );

////////////////////////////////////////////////////////////////////////////////
// System Configuration enumerators and utility functions
////////////////////////////////////////////////////////////////////////////////

NISYSCFGCFUNC NISysCfgExportConfiguration(
   NISysCfgSessionHandle                  sessionHandle,
   const char *                           destinationFile,
   const char *                           expertNames,               // NULL or "" => all experts
   NISysCfgBool                           overwriteIfExists
   );

NISYSCFGCFUNC NISysCfgImportConfiguration(
   NISysCfgSessionHandle                  sessionHandle,
   const char *                           sourceFile,
   const char *                           expertNames,               // NULL or "" => all experts
   NISysCfgImportMode                     importMode,
   char **                                detailedResult
   );

NISYSCFGCFUNC NISysCfgGenerateMAXReport(
   NISysCfgSessionHandle                  sessionHandle,
   const char *                           outputFilename,
   NISysCfgReportType                     reportType,
   NISysCfgBool                           overwriteIfExists
   );

NISYSCFGCFUNC NISysCfgCreateComponentsEnum(
   NISysCfgEnumSoftwareComponentHandle *  componentEnumHandle
   );

NISYSCFGCFUNC NISysCfgAddComponentToEnum(
   NISysCfgEnumSoftwareComponentHandle    componentEnumHandle,
   const char *                           ID,
   const char *                           version,
   NISysCfgVersionSelectionMode           mode
   );

NISYSCFGCFUNC NISysCfgFreeDetailedString(
   char                                   str[]
   );

NISYSCFGCFUNC NISysCfgNextResource(
   NISysCfgSessionHandle                  sessionHandle,
   NISysCfgEnumResourceHandle             resourceEnumHandle,
   NISysCfgResourceHandle *               resourceHandle
   );

NISYSCFGCFUNC NISysCfgNextSystemInfo(
   NISysCfgEnumSystemHandle               systemEnumHandle,
   char                                   system[]
   );

NISYSCFGCFUNC NISysCfgNextExpertInfo(
   NISysCfgEnumExpertHandle               expertEnumHandle,
   char                                   expertName[],
   char                                   displayName[],
   char                                   version[]
   );

// Caller should free detailedDescription using NISysCfgFreeDetailedString
NISYSCFGCFUNC NISysCfgNextComponentInfo(
   NISysCfgEnumSoftwareComponentHandle    componentEnumHandle,
   char                                   ID[],
   char                                   version[],
   char                                   title[],
   NISysCfgComponentType *                itemType,
   char **                                detailedDescription
   );

NISYSCFGCFUNC NISysCfgNextSoftwareSet(
   NISysCfgEnumSoftwareSetHandle          setEnumHandle,
   NISysCfgSoftwareSetHandle *            setHandle
   );

// Caller should free detailedDescription using NISysCfgFreeDetailedString
NISYSCFGCFUNC NISysCfgGetSoftwareSetInfo(
   NISysCfgSoftwareSetHandle              setHandle,
   NISysCfgIncludeComponentTypes          itemTypes,
   NISysCfgBool                           includeAddOnDeps,
   char                                   ID[],
   char                                   version[],
   char                                   title[],
   NISysCfgComponentType *                setType,
   char **                                detailedDescription,
   NISysCfgEnumSoftwareComponentHandle *  addOnEnumHandle,
   NISysCfgEnumSoftwareComponentHandle *  itemEnumHandle
   );

// Caller should free detailedDescription using NISysCfgFreeDetailedString
NISYSCFGCFUNC NISysCfgNextDependencyInfo(
   NISysCfgEnumDependencyHandle           dependencyEnumHandle,
   char                                   dependerID[],
   char                                   dependerVersion[],
   char                                   dependerTitle[],
   char **                                dependerDetailedDescription,
   char                                   dependeeID[],
   char                                   dependeeVersion[],
   char                                   dependeeTitle[],
   char **                                dependeeDetailedDescription
   );

NISYSCFGCFUNC NISysCfgResetEnumeratorGetCount(
   void *                                 enumHandle,
   unsigned int *                         count
   );

// Helper method to get the status string for a given status code.
NISYSCFGCFUNC NISysCfgGetStatusDescription(
   NISysCfgSessionHandle                  sessionHandle,              // Can be NULL
   NISysCfgStatus                         status,
   char **                                detailedDescription
   );

NISYSCFGCFUNC NISysCfgTimestampFromValues(
   NISysCfgUInt64                         secondsSinceEpoch1970, 
   double                                 fractionalSeconds, 
   NISysCfgTimestampUTC *                 timestamp
   );

NISYSCFGCFUNC NISysCfgValuesFromTimestamp(
   const NISysCfgTimestampUTC *           timestamp, 
   NISysCfgUInt64 *                       secondsSinceEpoch1970, 
   double *                               fractionalSeconds
   );

#ifdef __cplusplus
}
#endif

#endif
